package main;

import Arbore.ArboreFunctional;
import Arbore.Nod;
import functii.elementare.Constanta;
import functii.elementare.Necunoscuta;
import functii.trigonometrice.Sin;
import operatori.Plus;
import operatori.Produs;
import visitor.DerivareVisitor;
import visitor.ToStringVisitor;
import visitor.Visitor;

public class Main {
    public static void main(String[] args) {
		Nod plus=new Plus();//reprezentarea functiei x+3
		Nod xn=new Necunoscuta();
		Nod ct=new Constanta(3);
		
		plus.setfStang(xn);
		plus.setfDrept(ct);
		
		ArboreFunctional a=new ArboreFunctional(plus);
        Visitor v=new ToStringVisitor();
        Visitor v1=new DerivareVisitor();
        a.acceptVisitor(v);
        a.acceptVisitor(v1);
        System.out.println("Functia este: "+((ToStringVisitor)v).getS());
        System.out.println("Derivata functiei este: "+((DerivareVisitor)v1).getRezultatDeriv());
       
        //////////////////////////////////
		Nod produs=new Produs();//reprezentarea functiei x*3
		Nod xn1=new Necunoscuta();
		Nod ct1=new Constanta(3);
		
		produs.setfStang(xn1);
		produs.setfDrept(ct1);
		
		ArboreFunctional a1=new ArboreFunctional(produs);
        Visitor v2=new ToStringVisitor();
        Visitor v3=new DerivareVisitor();
        a1.acceptVisitor(v2);
        a1.acceptVisitor(v3);
        System.out.println("Functia este: "+((ToStringVisitor)v2).getS());
        System.out.println("Derivata functiei este: "+((DerivareVisitor)v3).getRezultatDeriv());
        
        //////////////////////////////////////////        
		Nod sin=new Sin();//reprezentarea functiei sin(x)
		Nod xn2=new Necunoscuta();
		
		sin.setfStang(xn2);
		
		ArboreFunctional a2=new ArboreFunctional(sin);
        Visitor v4=new ToStringVisitor();
        Visitor v5=new DerivareVisitor();
        a2.acceptVisitor(v4);
        a2.acceptVisitor(v5);
        System.out.println("Functia este: "+((ToStringVisitor)v4).getS());
        System.out.println("Derivata functiei este: "+((DerivareVisitor)v5).getRezultatDeriv());
    }
}
